package org.real.guetshop.utils;


import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.real.guetshop.constant.MessageConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

public class JwtUtil {

    //TODO 先写死后面在优化
    private static final String SECRET = "hgy"; // 密钥
    private static final Logger log = LoggerFactory.getLogger(JwtUtil.class);

    /**
     * 创建JWT Token。
     *
     * @param id 主题，通常是用户ID或用户名
     * @param issuedAt 签发时间
     * @param expiresAt 过期时间
     * @return 生成的JWT Token
     */
    public static String createToken(Integer id, Date issuedAt, Date expiresAt) {

        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET);    //设置加密算法
            return JWT.create()
                    .withSubject(String.valueOf(id))
                    .withIssuedAt(issuedAt)
                    .withExpiresAt(expiresAt)
                    .sign(algorithm);
        } catch (JWTCreationException exception) {
            // 处理Token创建过程中的异常，例如密钥无效等
            throw new RuntimeException(MessageConstant.UNKNOWN_ERROR);
        }
    }

    /**
     * 验证JWT Token。
     *
     * @param token      要验证的Token
     * @return 解析后的JWT对象
     * @throws JWTVerificationException 如果Token无效或签名不匹配
     */
    public static DecodedJWT verifyToken(String token) throws JWTVerificationException {
        Algorithm algorithm = Algorithm.HMAC256(SECRET);
        return JWT.require(algorithm).build().verify(token);
    }
}







/**
 * 从JWT Token中获取用户名或用户ID。
 *
 * @param token JWT Token
 * @return 用户名或用户ID
 * @throws JWTVerificationException 如果Token无效或签名不匹配
 */
//public static String getUserIdFromToken(String token) throws JWTVerificationException {
//    DecodedJWT decodedJWT = verifyToken(token, SECRET);
//    return decodedJWT.getSubject();
//}


/**
 * 检查JWT Token是否过期。
 *
 * @param token JWT Token
 * @return 如果Token过期返回true，否则返回false
 */
//    public static boolean isTokenExpired(String token) {
//        try {
//            DecodedJWT decodedJWT = verifyToken(token, SECRET);
//            return decodedJWT.isExpired();
//        } catch (JWTVerificationException exception) {
//            return true; // 如果Token无效或签名不匹配，视为过期
//        }
//    }
